const { log } = require('console')

// 启动express服务
;(async function () {
  // 引入express
  const express = require('express')
  // 引入连接
  const connect = require('./db/connect')
 
  // 引入解析cookie的中间件
  // const cookieParser = require('cookie-parser')
  // 引入解析session和cookie的中间件
  const session = require('express-session')
  // session数据存储到mongodb使用的包
  const MongoStore = require('connect-mongo')(session)

  //引入路由器中间件
  // 注意: 如果一个文件夹下的文件是index.js,则可以直接忽略index.js
  const router = require('./routes')

  // 判断是否连接成功
  try {
    await connect
    console.log('数据库连接成功')
  } catch (error) {
    return console.log('数据库连接失败', error)
  }

  // 启动express服务
  const app = express()

  // 配置中间件,处理post请求的数据
  app.use(express.urlencoded({ extended: false }))
  // 配置中间件,处理所有的静态资源
  app.use(express.static('./view'))

  // 使用操作cookie的中间件
  // app.use(cookieParser())

  // 配置模板
  app.set('view engine', 'ejs') //告诉express.要使用ejs模板引擎
  app.set('views', './temp') // 告诉express. 模板存放在哪里
  // 使用操作seesion和cookie的中间件
  app.use(
    session({
      name: 'userid', //设置cookie的name，默认值是：connect.sid
      secret: 'atguigu', //参与加密的字符串（又称签名）
      saveUninitialized: false, //是否为每次请求都设置一个cookie用来存储session的id
      resave: true, //是否在每次请求时，强制重新保存session，即使他们没有变化
      store: new MongoStore({
        url: 'mongodb://localhost:27017/sessions_container',
        touchAfter: 24 * 3600, //修改频率（例：//在24小时之内只更新一次）
      }),
      cookie: {
        httpOnly: true, // 开启后前端无法通过 JS 操作cookie
        maxAge: 1000 * 30, // 设置cookie的过期时间
      },
    })
  )

  // 注意: 路由器中间件是用来配置路由的,所以一定要写在其他中间件的下面
  app.use(router)

  // 开启服务
  app.listen(5000, (err) => {
    if (err) console.log('失败', err)
    else console.log('成功')
  })
})()
